package com.example.ehCache;

import javassist.NotFoundException;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * Created by Administrator on 2017/1/12 0012.
 * 2017-01-12 15:28:43.296  WARN 47504 --- [           main]
 * ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization
 * - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: E
 * rror creating bean with name 'demoInfo2Controller': Injection of resource dependencies failed;
 * nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
 * No qualifying bean of type 'com.example.ehCache.DemoInfo2Service' available:
 * expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:
 * {@javax.annotation.Resource(shareable=true, lookup=, name=, description=, authenticationType=CONTAINER, type=class java.lang.Object, mappedName=)}

 */
@Service
public class DemoInfo2ServiceImpl implements DemoInfo2Service {


    //这里的单引号不能少，否则会报错，被识别是一个对象;
    public static final String CACHE_KEY = "'demoInfo2'";

    @Resource
    private DemoInfo2Repository demoInfo2Repository;

    /**
     * value属性表示使用哪个缓存策略，缓存策略在ehcache.xml
     */
    public static final String DEMO_CACHE_NAME = "demo2";


    /**
     * 保存数据.
     * @param demoInfo2
     */
    @CacheEvict(value=DEMO_CACHE_NAME,key=CACHE_KEY)
    @Override
    public DemoInfo2 save(DemoInfo2 demoInfo2) {
        return demoInfo2Repository.save(demoInfo2);
    }


    @Cacheable(value=DEMO_CACHE_NAME,key="'demoInfo2_'+#id")
    @Override
    public DemoInfo2 findById(Long id) {
        System.err.println("--没有走缓存！"+id);
        return demoInfo2Repository.findOne(id);
    }

    /**
     * http://www.mincoder.com/article/2096.shtml:
     * 修改数据.
     * 在支持Spring Cache的环境下，对于使用@Cacheable标注的方法，Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素，
     * 如果存在就不再执行该方法，而是直接从缓存中获取结果进行返回，否则才会执行并将返回结果存入指定的缓存中。
     * @CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果，
     * 而是每次都会执行该方法，并将执行结果以键值对的形式存入指定的缓存中。
     * @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。
     * @param updated
     * @return
     * @throws NotFoundException
     */

    @CachePut(value = DEMO_CACHE_NAME,key = "'demoInfo2_'+#updated.getId()")
    @Override
    public DemoInfo2 update(DemoInfo2 updated) throws NotFoundException {
        DemoInfo2 demoInfo2 = demoInfo2Repository.findOne(updated.getId());
        if(demoInfo2 == null){
            throw new NotFoundException("No find");
        }
        demoInfo2.setName(updated.getName());
        demoInfo2.setPwd(updated.getPwd());
        System.out.println("--->没修改数据库，只更新缓存");
        return demoInfo2;
    }

    /**
     * 删除数据.
     * @param id
     */
    @CacheEvict(value = DEMO_CACHE_NAME,key = "'demoInfo2_'+#id")//这是清除缓存.
    @Override
    public void delete(Long id) {
        demoInfo2Repository.delete(id);
    }

}
